import java.util.Scanner;

public class test {
    //确定二进制数的第x位是1还是0
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
//        int n = scan.nextInt();
        //确定二进制数的第x位是1还是0
//        System.out.println(function1(n, 8));

        //把一个二进制数的第x位修改成1
//        System.out.println(function2(6,3));

        //把一个二进制数的第x位修改成0
//        System.out.println(function3(9, 3));

        //把一个二进制数最右侧的1提取出来
        System.out.println(function4(20));

        //把一个二进制数最右侧的1去掉
        System.out.println(function5(20));

    }
    //把一个二进制数最右侧的1去掉
    private static int function5(int n) {
        //把1右侧的数包括1全部取反
        return n&(n-1);
    }

    //把一个二进制数最右侧的1提取出来
    private static int function4(int n) {
        //效果比如：00000000010000
        // 左边的1的全变成了0，右边没变（因为这是最右侧的1）
        //如何把左边的全变成0：把左边的&上它的~数（这样&的两边就都有0了）
        //右边的本身就为0，&0不会改变它们的0，
        //那如何操作可以以最右侧的1为分界左边按位取反，右边不动？
        //取反+1；把整个数取反，但是+1会把右边重新恢复
        return n&(-n);
    }


    //把一个二进制数的第x位修改成0
    private static int function3(int n, int x) {
        //先将1左移到x位然后取反
        return n&(~(1<<x));
    }

    //把一个二进制数的第x位修改成1
    private static int function2(int n, int x) {
        //先将1左移到x位

        return n|(1<<x);
    }

    //确定二进制数的第x位是1还是0
    private static int function1(int n, int x) {
        //直接右移x位，把第x位放到最低位
        n = n>>x;
        //&上1，  0&1-》0 ， 1&1-》0
        //|上0， 0|0-》0  ，1|0-》1
//        n=n&1;
        n= n |0;
        return n;
    }

}
